﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using ABC.Business.Models;
using ABC.Controllers.ViewModels.My;

namespace ABC.Controllers.Areas.My
{
    [Authorize]
    public class AccountController : BaseController
    {
        private readonly UserModel userModel;
        private readonly SmtpClientModel smtpClientModel;


        public AccountController(UserModel userModel, SmtpClientModel smtpClientModel)
        {
            this.userModel = userModel;
            this.smtpClientModel = smtpClientModel;
        }
        public ActionResult Index()
        {
            var model = new MyAccountViewModel();
            model.ListPhones = userModel.GetUserPhones(CurrentUser.Id);
            model.ListEmails = userModel.GetUserEmails(CurrentUser.Id);
            model.ListIm = userModel.GetUserIms(CurrentUser.Id);
            model.ListSocNetworks = userModel.GetUserSocNetworks(CurrentUser.Id);
            model.ListAddresses = userModel.GetUserAddresses(CurrentUser.Id);
            ViewData["changessaved"] = TempData["changessaved"] != null && (bool) TempData["changessaved"];
            return View(model);
        }
        [HttpPost]
        public ActionResult Index(MyAccountViewModel model)
        {
            var values = new Dictionary<string, object>();
            var typesEmail = Request.Form["EmailType"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var countAddress = Int32.Parse(Request.Form["countaddress"]);

            var currentEmails = userModel.GetUserEmails(CurrentUser.Id);

            if (!currentEmails.Any(x => x.Value == Request.Form["EmailValue0"]) || string.IsNullOrEmpty(Request.Form["EmailValue0"]))
            {
                values.Add("EmailАктивен", false);
            }
            else
            {
                var firstOrDefault = currentEmails.Where(x => Request.Form["EmailValue0"] == x.Value).FirstOrDefault();
                values.Add("EmailАктивен", firstOrDefault != null && firstOrDefault.IsActive);
            }
            values.Add("Email", Request.Form["EmailValue0"]);
            values.Add("ТипEmail", typesEmail[0]);

            var countField = 1;
            for (var i = 1; i < typesEmail.Length; i++)
            {
                if (!string.IsNullOrEmpty(Request.Form["EmailValue" + i]))
                {
                    if (!currentEmails.Any(email => Request.Form["EmailValue" + i] == email.Value))
                    {
                        values.Add("EmailАктивен" + countField, false);
                    }
                    else
                    {
                        var firstOrDefault = currentEmails.Where(x => Request.Form["EmailValue" + i] == x.Value).FirstOrDefault();
                        values.Add("EmailАктивен" + countField, firstOrDefault != null && firstOrDefault.IsActive);
                    }
                    values.Add("Email" + countField, Request.Form["EmailValue" + i]);
                    values.Add("ТипEmail" + countField, typesEmail[i]);
                    countField++;
                }
            }
            for (var i = countField; i < typesEmail.Length; i++)
            {
                values.Add("Email" + i, "");
            }

            countField = 0;
            for (var i = 0; i < countAddress; i++)
            {
                if (string.IsNullOrEmpty(Request.Form["AddressValue" + i])) continue;
                values.Add("Адрес" + countField, Request.Form["AddressValue" + i]);
                countField++;
            }
            for (var i = countField; i < countAddress; i++)
            {
                values.Add("Адрес" + i, "");
            }

            values.Add("Имя", model.FirstName);
            values.Add("Фамилия", model.LastName);
            values.Add("НазваниеОбъекта", string.IsNullOrEmpty(values["Email"].ToString()) ? "" : values["Email"]);
            values.Add("Отчество", model.MiddleName);
            values.Add("Пол", model.Sex);
            values.Add("Компания", model.Company);
            values.Add("Должность", model.Post);
            values.Add("Отдел", model.Department);
            DateTime date;
            values.Add("ДатаРождения", DateTime.TryParse(model.BirthDay, CultureInfo.CreateSpecificCulture("ru-RU"), DateTimeStyles.None, out date) ? date : DateTime.MinValue);
            var typesPhone = Request.Form["PhoneType"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var typesIm = Request.Form["ImType"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var typesSocNet = Request.Form["SocNetType"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            var currentPhones = userModel.GetUserPhones(CurrentUser.Id);
            if (string.IsNullOrEmpty(Request.Form["PhoneValue0"]) || !currentPhones.Any(x => x.Value == Request.Form["PhoneValue0"]))
            {
                values.Add("ТелефонныйНомерАктивен", userModel.IsCityPhoneNumber(Request.Form["PhoneValue0"]));
            }
            else
            {
                var firstOrDefault = currentPhones.Where(x => Request.Form["PhoneValue0"] == x.Value).FirstOrDefault();
                values.Add("ТелефонныйНомерАктивен", firstOrDefault != null && firstOrDefault.IsActive);
            }
            values.Add("ТелефонныйНомер", Request.Form["PhoneValue0"]);
            values.Add("ТипТелефонныйНомер", typesPhone[0]);
            countField = 1;
            for (var i = 1; i < typesPhone.Length; i++)
            {
                if (!string.IsNullOrEmpty(Request.Form["PhoneValue" + i]))
                {
                    if (!currentPhones.Any(phone => Request.Form["PhoneValue" + i] == phone.Value))
                    {
                        values.Add("ТелефонныйНомерАктивен" + countField, userModel.IsCityPhoneNumber(Request.Form["PhoneValue" + i]));
                    }
                    else
                    {
                        var firstOrDefault = currentPhones.Where(x => Request.Form["PhoneValue" + i] == x.Value).FirstOrDefault();
                        values.Add("ТелефонныйНомерАктивен" + countField, firstOrDefault != null && firstOrDefault.IsActive);
                    }
                    values.Add("ТелефонныйНомер" + countField, Request.Form["PhoneValue" + i]);
                    values.Add("ТипТелефонныйНомер" + countField, typesPhone[i]);
                    countField++;
                }
            }
            for (var i = countField; i < typesPhone.Length; i++)
            {
                values.Add("ТелефонныйНомер" + i, "");
            }

            countField = 0;
            for (var i = 0; i < typesIm.Length; i++)
            {
                if (string.IsNullOrEmpty(Request.Form["ImValue" + i])) continue;
                values.Add("Im" + countField, Request.Form["ImValue" + i]);
                values.Add("ТипIm" + countField, typesIm[i]);
                countField++;
            }
            for (var i = countField; i < typesIm.Length; i++)
            {
                values.Add("Im" + i, "");
            }

            countField = 0;
            for (var i = 0; i < typesSocNet.Length; i++)
            {
                if (string.IsNullOrEmpty(Request.Form["SocNetValue" + i])) continue;
                values.Add("СоцСеть" + countField, Request.Form["SocNetValue" + i]);
                values.Add("ТипСоцСеть" + countField, typesSocNet[i]);
                countField++;
            }
            for (var i = countField; i < typesSocNet.Length; i++)
            {
                values.Add("СоцСеть" + i, "");
            }

            values.Add("Регион", model.Region);
            DateTime dateDrive;
            values.Add("ДатаПолученияПрав", DateTime.TryParse(model.DateLawToCar, CultureInfo.CreateSpecificCulture("ru-RU"), DateTimeStyles.None, out dateDrive) ? dateDrive : DateTime.MinValue);
            userModel.UpdateUserInfo(CurrentUser.Id, values);
            if (!string.IsNullOrEmpty(model.NewPassword))
            {
                if (model.TopPassword == CurrentUser.Password)
                {
                    userModel.UpdateUserPassword(CurrentUser.Id, model.NewPassword);
                }
            }
            model.ListPhones = userModel.GetUserPhones(CurrentUser.Id);
            model.ListEmails = userModel.GetUserEmails(CurrentUser.Id);

            /*if (model.ListPhones.Any(x => x.IsActive == false) || model.ListEmails.Any(x => x.IsActive == false))
            {
                return RedirectToAction("Index", "Account");
            }*/
            TempData["changessaved"] = true;
            return RedirectToAction("Index", "Account");
        }

        public ActionResult Notifications()
        {
            var model = new MyNotificationsViewModel();
            model.Emails = userModel.GetContactsUserForNotification(CurrentUser.Id, "Email", 0, false);
            model.Phones = userModel.GetContactsUserForNotification(CurrentUser.Id, "ТелефонныйНомер", 0, false).Where(x=>!userModel.IsCityPhoneNumber(x.Value)).ToList();
            model.ByEmail = userModel.GetNotification("УведомленияПоПочте", CurrentUser.Id);
            model.BySms = userModel.GetNotification("УведомленияПоСмс", CurrentUser.Id);
            return View(model);
        }
        [HttpPost]
        public ActionResult Notifications(MyNotificationsViewModel model)
        {
            var values = new Dictionary<string, object>();
            values.Add("УведомленияПоПочте", model.ByEmail);
            values.Add("УведомленияПоСмс", model.BySms);

            var emails = Request.Form.Get("email");
            var phones = Request.Form.Get("phone");
            values.Add("СписокДляУведомленийПоEmail", emails != null ? emails.Replace(",", ";") : "");
            values.Add("СписокДляУведомленийПоТелефонныйНомер", phones != null ? phones[0].ToString() : "");

            userModel.SetNotifications(CurrentUser.Id, values);
            return RedirectToAction("Notifications");
        }

        public ActionResult ConfirmPhone(string phone, string index)
        {
            var model = new ConfirmViewModel();
            var number = RandomModel.GetRandomNumber();
            SmsModel.Send(phone, "Код подтверждения: " + number);
            userModel.SetValue(CurrentUser.Id, "ТелефонныйНомерКодАктивации" + (index == "0" ? "" : index), number);
            model.SendTo = phone;
            model.Index = index;
            return View(model);
        }
        [HttpPost]
        public string SendSms(string phone, string index)
        {
            var number = RandomModel.GetRandomNumber();
            SmsModel.Send(phone, "Код подтверждения: " + number);
            userModel.SetValue(CurrentUser.Id, "ТелефонныйНомерКодАктивации" + (index == "0" ? "" : index), number);
            return "ok";
        }
        [HttpPost]
        public ActionResult ConfirmPhone(ConfirmViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.Code == userModel.GetValue<string>(CurrentUser.Id, "ТелефонныйНомерКодАктивации" + (model.Index == "0" ? "" : model.Index)))
                {
                    userModel.SetValue(CurrentUser.Id, "ТелефонныйНомерАктивен" + (model.Index == "0" ? "" : model.Index), true);
                    return RedirectToAction("Index", "My");
                }
                ModelState.AddModelError("e", "Указан не верный код подтверждения. Проверьте введенные данные и отправьте запрос повторно.");
            }
            return View(model);
        }

        public ActionResult ConfirmEmail(string email, string index)
        {
            var model = new ConfirmViewModel();
            var number = RandomModel.GetRandomNumber();
            if (smtpClientModel.Send(email, "Подтверждение электронной почты", "Код: " + number))
            {
                userModel.SetValue(CurrentUser.Id, "EmailКодАктивации" + (index == "0" ? "" : index), number);
            }
            model.SendTo = email;
            model.Index = index;
            return View(model);
        }
        [HttpPost]
        public ActionResult ConfirmEmail(ConfirmViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.Code == userModel.GetValue<string>(CurrentUser.Id, "EmailКодАктивации" + (model.Index == "0" ? "" : model.Index)))
                {
                    userModel.SetValue(CurrentUser.Id, "EmailАктивен" + (model.Index == "0" ? "" : model.Index), true);
                    return RedirectToAction("Index", "My");
                }
                ModelState.AddModelError("e", "Указан не верный код подтверждения. Проверьте введенные данные и отправьте запрос повторно.");
            }
            return View(model);
        }

        [HttpPost]
        public string SendToEmailCode(string email, string index)
        {
            var number = RandomModel.GetRandomNumber();
            if (smtpClientModel.Send(email, "Подтверждение электроной почты", string.Format("Код подтверждения: {0}", number)))
            {
                userModel.SetValue(CurrentUser.Id, "EmailКодАктивации" + (index == "0" ? "" : index), number);
                return "ok";
            }
            return "no";
        }
    }
}
